#include<iostream>
#include<string>
#include<unistd.h>
#include <pthread.h>
#include<vector>
using namespace std;

static int num=1;
typedef void(*callback_t)();   //void func() 形式的函数的函数指针,callback_t包含在线程的执行函数里，是回调函数

//对线程进行封装
class Thread
{
public:
    static void* Routine(void* args)  //args:cb_  为什么要加static，不加的话，Routin参数里就会有一个 this 指针
    {
        Thread* self=static_cast<Thread*>(args);
        self->cb_();
        return nullptr;
    }

    void Join()
    {
        if(isrunnig_)
        {
            pthread_join(id_,nullptr);
            isrunnig_=false;
        }
    }

public:
    Thread(callback_t cb):ThreadName_(""), id_(0), isrunnig_(false),cb_(cb)
    {}

    void Run()
    {
        //开始创建线程
        isrunnig_=true;
        ThreadName_="Thread"+to_string(num++);
        start_timestamp_=time(nullptr);    //time(nullptr): 获取当前系统时间的时间戳
        pthread_create(&id_,nullptr,Routine,(void*)this); //这里的this指针不能改成cb_,因为函数指针的转换存在风险
    }

    ~Thread()
    {
        Join();
    }

private:
    string ThreadName_;
    pthread_t id_;
    bool isrunnig_;   //可表示为线程是否被创建过
    uint64_t start_timestamp_;   //可以计算出线程运行时间
    callback_t cb_;
};

